import axios from "axios";
import store from "@/store";
import router from "@/router";
import QS from "qs";
import { Message } from "element-ui";

import NProgress from "nprogress";

// 环境切换
if (process.env.NODE_ENV == "development") {
  console.log("开发环境");
  // axios.defaults.baseURL = 'http://localhost:8080';
} else if (process.env.NODE_ENV == "production") {
  axios.defaults.baseURL = "http://182.92.165.30:7001";
}

// 设置请求超时
axios.defaults.timeout = 10000;

// post 请求头的设置
axios.defaults.headers.post["Content-Type"] =
  "application/x-www-form-urlencoded;charset=UTF-8";

// 请求拦截
axios.interceptors.request.use(
  config => {
    const token = store.state.token;
    config.headers["Authorization"] = token;
    NProgress.start();
    return config;
  },
  error => {
    // Do something with request error
    return Promise.reject(error);
  }
);

axios.interceptors.response.use(
  response => {
    NProgress.done();
    // 200说明接口请求成功，否则抛出错误
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是2开头的情况 后台协调
  error => {
    NProgress.done();
    console.error(error);
    if (error.response.status) {
      switch (error.response.status) {
        // 401 未登录
        // 未登陆则跳转到登陆页面
        // 在登陆成功后返回当前页面，这一步需要在登陆页操作
        case 401:
          console.log(401);
          router.replace({ path: "/login" });
          localStorage.removeItem("token");
          Message.error({
            message: "401权限不足"
          });
          break;
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          console.log(403);
          Message.error({
            message: "403网络错误"
          });
          break;
        case 404:
          console.log(404);
          Message.error({
            message: "404网络错误"
          });
          break;
        case 500:
          console.log(500);
          Message.error({
            message: "500服务器异常"
          });
          break;
      }
    }
    return Promise.reject(error.response);
  }
);

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params
      })
      .then(res => {
        resolve(res.data);
      })
      .catch(err => {
        reject(err.data);
      });
  });
}

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function post(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, QS.stringify(params))
      .then(res => {
        resolve(res.data);
      })
      .catch(err => {
        reject(err.data);
      });
  });
}

export default axios;
